/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Datos;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.StringTokenizer;
/**
 *
 * @author Toshiba
 */
public class Transacciones {
    //funcion que recibe un objeto y lo devuelve desmenuzado en un String
    serviciosDB serv = new serviciosDB();
     
    public static String obtenStrings(Object objeto, int numC,int ai) 
    {
     Field [] registro=objeto.getClass().getDeclaredFields();   
     String valores="";
        try 
        {
            for(int i=ai;i<numC;i++)
            {
                registro[i].setAccessible(true);
                if(registro[i].getGenericType().toString().compareTo("class java.lang.String")==0)
                    valores+="'"+registro[i].get(objeto).toString() +"'";
                else 
                    valores+=registro[i].get(objeto).toString();
                if(i<numC-1)
                    valores+=",";
            }
            if(ai==1)
                valores="null,"+valores;
            return valores;
        }
        catch(IllegalArgumentException e){return null;}
        catch(IllegalAccessException e){return null;}
    }
    //recibe un objeto, la tabla y lo guarda en la bdd
    public boolean insertar(String tabla, Object objeto,int numC, int ai)  
    {
        
        String q="INSERT INTO " +tabla+" VALUES ("+ obtenStrings(objeto,numC,ai)+")"; 
        if(serv.ejecutarUpdate(q))
            return true;
       
        else
            return false;
    }
    //recibe un objeto, la tabla, el numero de atributos, la condicion
    //ylo modifica en la base de datos
    public boolean modificar(String tabla,Object objeto,int numC, String condicion)
    {
        String q="UPDATE "+tabla+" SET ";
        Field [] columnas = objeto.getClass().getDeclaredFields();
        StringTokenizer str1=new StringTokenizer(obtenStrings(objeto,numC,0),",");
        
        for(int i=0;i<numC;i++)
        {
            q+=columnas[i].getName()+"="+str1.nextToken();
            if(i<numC-1)
                q+=",";
        }
        q=q+" WHERE "+condicion;
        if(serv.ejecutarUpdate(q))
            return true;
        else
            return false;
    }
    //carga todos los datos de una tabla
    public boolean cargarDatos(String tabla)
    {
        
        if(serv.ejecutarConsulta("SELECT * FROM "+tabla))
            return true;
        return false;
    }
    //ejecuta una consulta select
    //recibe la tablam los campos y las condiciones,
    //arma la consulta y la ejecuta
    public boolean ejecutaConsulta(String campos,String tabla, String condiciones)
    {
        String q;
        q="SELECT "+campos+" FROM "+tabla;
        if (condiciones != null)
            q+=" WHERE "+condiciones;
        if(serv.ejecutarConsulta(q)) 
            return true;
        return false;
    }
    //recibe el nombre de la tabla, el objeto y lo elimina de la bdd
    public boolean eliminar(String tabla, Object objeto,int numC)
    {
        
        String q="DELETE "+tabla+" WHERE ";
        Field [] columnas = objeto.getClass().getDeclaredFields();
        for(int i=0;i<numC;i++)
        {
            columnas[i].setAccessible(true);
            try
            {
            q+=columnas[i].getName()+"='"+columnas[i].get(objeto).toString()+"'";
            }catch(java.lang.IllegalAccessException e){}
            if(i<numC-1)
                q+="AND ";
        }
        System.out.println(q);
        if(serv.ejecutarUpdate(q))
            return true;
        return false;
    }
    //elimina un objeto segun la clave que se envie
    public boolean eliminaClave(String tabla ,String[] campos, String [] condiciones, int numC, String cond)
    {
        String q="DELETE "+tabla+" WHERE ";
        for(int i=0;i<numC;i++)
        {
            
            q+=campos[i]+"='"+condiciones[i]+"'";
            if(i<numC-1)
                q+=" AND ";
        }
        if(cond!=null)
        {
            q+=" AND "+cond;
        }
        System.out.println(q);
        if(serv.ejecutarUpdate(q))
            return true;
        return false;
    }
    //devuelve un regstro de la tabla cargada
    public String[] ObtenRegistro(int numC, int band)
    {   
        String [] resultados = new String[numC];
        try
        {
            if (band==0 && serv.resultado.first())
            {
                for(int i=0;i<numC;i++)
                {
                    resultados[i]= serv.resultado.getString(i+1);
                }
                return resultados;
            }
            else if (band==1 && serv.resultado.next())
            {
                for(int i=0;i<numC;i++)
                {
                    resultados[i]= serv.resultado.getString(i+1);
                }
                return resultados;
            }
        } catch (SQLException e) {
            System.err.println("Error");
            //e.printStackTrace();
        }
        return null;
    }
    //cuenta los registros de una tabla de acuerdo a una condicion
    public int cuentaRegistros(String tabla, String condicion)
    {
        int nr=0;
        try
        {
        String q;    
        q="SELECT COUNT(*) FROM "+tabla;
        
        if(condicion!=null)
            q+=" WHERE "+condicion;
        serv.ejecutarConsulta(q);
        if (serv.resultado.first())
        nr = serv.resultado.getInt(1);
        } catch (SQLException e) {
            System.err.println("Error");
        }
        return nr;
    }//recibe el nombre de usuario, la contrase;a y eltipo de privilegio
    //, crea el usuario y le asigna los privilegios

    public Transacciones() {
        serv.conectar("Correo", "root", "jony1989");
    }
    
}


